import pandas as pd
import warnings
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import font_manager
from mpl_toolkits.mplot3d import Axes3D

warnings.filterwarnings("ignore") 
font_path = 'SimHei.ttf'  # 设置本地字体
font_manager.fontManager.addfont(font_path)
prop = font_manager.FontProperties(fname=font_path)
 
plt.rcParams["font.family"] = "SimHei"
plt.rcParams['font.sans-serif'] = prop.get_name()


g = {'gp':"股票","pg":"偏股","hh":"混合","zs":"指数","zq":"债券"}

def roedistribution(df_1,ftype):
	"""
    收益分布
    @param df_1:
    @param ftype
    @return: 
    """
	distribution = df_1["近1年"].groupby(pd.cut(df_1["近1年"], range(-15, 135, 10))).count()
	distribution.plot(kind="bar", figsize=(12,6), color="green")
	if ftype in g:
		plt.title(g[ftype]+"型近一年的基金收益分布")
	plt.savefig("./file/"+g[ftype]+"型近一年的基金收益分布.png")
	#plt.show()

def roetop10(df_1,ftype):
	"""
    收益前十
    @param df_1:
    @param ftype
    @param return: 
    """
	df_1.sort_values("近1年", ascending=False)[:10]
	fig = plt.figure(figsize=(20,8))
	plt.bar(df_1.sort_values("近1年", ascending=False)[:10]['基金名称'], df_1.sort_values("近1年", ascending=False)[:10]['近1年'])
	#plt.plot(df_1.sort_values("近1年", ascending=False)[:10]['基金名称'], df_1.sort_values("近1年", ascending=False)[:10]['近1年'])
	if ftype in g:
		plt.title(g[ftype]+"型近一年的收益率TOP10")
	plt.grid()
	plt.savefig("./file/"+g[ftype]+"型近一年的收益率TOP10.png")
	#plt.show()

def fumanager(df_1,ftype):
	"""
    近一年收益率前100的同一基金经理管理几支基金及平均收益率
    @param df_1:
    @param ftype
    @param return: 
    """
	order_yield = df_1.sort_values("近1年", ascending=False)
	order_yield = order_yield.drop(order_yield[order_yield["基金经理"] == "--"].index)  # 清除没有数据的行
	size = order_yield[:100].groupby("基金经理").size()
	revenue_df = order_yield[:100].groupby("基金经理").mean()

	# 横纵轴数据，数据格式是list
	x_data = revenue_df.index
	y_data = size
	y_data2 = revenue_df["近1年"]
	fig = plt.figure(figsize=(22, 10))
	ax1 = fig.add_subplot(111)

	# 绘制折线图
	ax1.bar(x_data, y_data)
	ax1.set_ylim([0,6])

	ax1.tick_params(axis='x', rotation=90)
	ax2 = ax1.twinx()
	ax2.plot(x_data, y_data2, c="red")
	for x, y in zip(x_data, y_data2):
	    ax2.annotate(y, (x, y))

	# y轴文字叙述
	ax2.set_ylabel('近1年平均收益率')
	ax1.set_ylabel('持有基金个数')
	if ftype in g:
		plt.title(g[ftype]+"型近一年收益率前100的同一基金经理管理几支基金及平均收益率")
	plt.savefig("./file/"+g[ftype]+"型近一年收益率前100的同一基金经理管理几支基金及平均收益率.png")
	#plt.show()
	#plt.show()
def roeestablished1(df_1,ftype):
	"""
    近一年收益率前500成立时间分布图
    @param df_1:
    @param ftype
    @param return: 
    """
	order_yield = df_1.sort_values("近1年", ascending=False)
	order_yield = order_yield.drop(order_yield[order_yield["成立日期"] == "--"].index)  # 清除没有数据的行

	# order_yield[:100]["成立日期"].to_frame().groupby("成立日期").size().plot(kind="bar", figsize=(20, 12))
	o = order_yield[:100]["成立日期"].to_frame()
	o['year'] = pd.to_datetime(o['成立日期']).dt.year
	c = o["year"].groupby(pd.cut(o["year"], range(2009, 2022))).count()
	#c
	fig = plt.figure(figsize=(20,8)) 
	plt.scatter(x=c.index.astype(str), y=c.values,alpha=0.5,s=c.values*100)
	if ftype in g:
		plt.title(g[ftype]+"型近一年收益率前500成立时间分布图一")
	plt.savefig("./file/"+g[ftype]+"型近一年收益率前500成立时间分布图一.png")
	#plt.show()
def roeestablished2(df_1,ftype):
	"""
    近一年收益率前500成立时间分布图
    @param df_1:
    @param ftype
    @param return: 
    """
	order_yield = df_1.sort_values("近1年")
	order_yield = order_yield.drop(order_yield[order_yield["成立日期"] == "--"].index)  # 清除没有数据的行

	o = order_yield[-100:][["成立日期", "近1年"]]#.to_frame()
	o["成立日期"] = pd.to_datetime(o["成立日期"])
	fig = plt.figure(figsize=(20,8)) 
	plt.scatter(x=o["成立日期"], y=o["近1年"],alpha=0.5)
	plt.xticks(pd.date_range(start='20100601',end='20211201', freq='320D'), rotation=30)
	if ftype in g:
		plt.title(g[ftype]+"型近一年收益率前500成立时间分布图二")
	plt.savefig("./file/"+g[ftype]+"型近一年收益率前500成立时间分布图二.png")
	#plt.show()
def scaledistribution(df_1,ftype):
	"""
    近一年收益率前500的资产规模分布
    @param df_1:
    @param ftype
    @param return: 
    """
	df_1['资产'] = df_1['资产规模'].str.extract(r"(\d+.\d+)亿元.*")
	df_1['资产'] = pd.to_numeric(df_1['资产'], downcast='integer')
	distribution = df_1["资产"].groupby(pd.cut(df_1["资产"], range(0, 125, 10))).count()
	distribution.plot(kind="bar", figsize=(20,8), color="green")
	if ftype in g:
		plt.title(g[ftype]+"型近一年收益率前500的资产规模分布")
	plt.savefig("./file/"+g[ftype]+"型近一年收益率前500的资产规模分布.png")
	#plt.show()
def roescaledistribution(df_1,ftype):
	"""
    近1年收益率与资产规模关系
    @param df_1:
    @param ftype
    @param return: 
    """
	df_1['资产'] = df_1['资产规模'].str.extract(r"(\d+.\d+)亿元.*")
	df_1['资产'] = pd.to_numeric(df_1['资产'], downcast='integer')# 清除脏数据
	fig = plt.figure(figsize=(20,8)) 
	clear = df_1[['近1年', '资产']].dropna().sort_values("资产",ascending=False)
	plt.scatter(clear['资产'], clear['近1年'],alpha=0.5,s=300)
	if ftype in g:
		plt.title(g[ftype]+"型近1年收益率与资产规模关系")
	plt.savefig("./file/"+g[ftype]+"型近1年收益率与资产规模关系.png")
	#plt.show()
def position(df_1,df_2,ftype):
	"""
    近1年基金收益率排名前50中持仓股累计占比排名前30
    @param df_1
    @paramdf_2
    @param ftype
    @return: 
    """
	first_50 = df_1.sort_values("近1年", ascending=False)[:50]
	concat = pd.merge(first_50, df_2, on="基金代码")[["持仓股票名称", "持仓股票持股市值"]]
	concat["持仓股票持股市值"] = concat["持仓股票持股市值"]/concat["持仓股票持股市值"].sum()
	res = concat.groupby("持仓股票名称").sum().sort_values("持仓股票持股市值", ascending=False)[:30]

	fig = plt.figure(figsize=(20,8)) 
	plt.pie(res["持仓股票持股市值"],
	        labels=res.index, # 设置饼图标签
	        autopct='%.2f%%', # 格式化输出百分比
	       )
	if ftype in g:
		plt.title(g[ftype]+"型近1年基金收益率排名前50中持仓股累计占比排名前30")
	plt.savefig("./file/"+g[ftype]+"型近1年基金收益率排名前50中持仓股累计占比排名前30.png")
	#plt.show()
def fumanager_scaledistribution_roe(fund_manager_df):
	"""
    基金经理从业时间及基金资产总规模和基金最佳回报关系
    @param fund_manager_df:
    @return: 
    """
	plt.figure(figsize=(10,6),dpi=80)
	ax=plt.axes(projection='3d')
	ax.scatter(fund_manager_df['累计从业时间'].tolist(),fund_manager_df['现任基金资产总规模'].tolist(),fund_manager_df['现任基金最佳回报'].tolist())
	ax.set_xlabel('累计从业时间')
	ax.set_ylabel('现任基金资产总规模')
	ax.set_zlabel('现任基金最佳回报')
	plt.title("基金经理从业时间及基金资产总规模和基金最佳回报关系")
	plt.savefig("./file/基金经理从业时间及基金资产总规模和基金最佳回报关系.png")
	#plt.show()
